import type { MenuOption } from 'naive-ui'
import { RouteRecordRaw } from 'vue-router'

import { MenuItem } from '@/apis/menu/type/vo'

const modules = import.meta.glob('../views/**/**.vue')
/**
 * 将 Promise 的结果转换为元组类型
 *
 * @param promise 需要转换的 Promise 对象
 * @returns 如果 Promise 成功，则返回 [undefined, result]，如果 Promise 失败，则返回 [error]
 */
export function catchToTuple<T>(promise: Promise<T>): Promise<[undefined, T] | [Error]> {
  return promise.then((res) => [void 0, res] as [undefined, T]).catch((err) => [err] as [Error])
}

console.log(modules)
function buildTree<T extends { id: number; parent_id?: number | null }>(
  items: T[],
  createItem: (item: T) => any,
  cleanEmptyChildren: boolean = true,
): any[] {
  // 判断当前数组的长度只有1 返回当前数组
  if (items.length === 1) {
    return [createItem(items[0])]
  }

  const itemMap = new Map<number, any>()
  const result: any[] = []

  // 创建所有项目并填充到 Map 中
  items.forEach((item) => {
    const newItem = createItem(item)
    itemMap.set(item.id, newItem)

    if (item.parent_id === null || item.parent_id === undefined) {
      result.push(newItem)
    }
  })

  // 将子项目附加到父项目中
  items.forEach((item) => {
    if (item.parent_id !== null && item.parent_id !== undefined) {
      const parentItem = itemMap.get(item.parent_id!)
      if (parentItem) {
        if (!parentItem.children) {
          parentItem.children = []
        }
        parentItem.children.push(itemMap.get(item.id)!)
      }
    }
  })

  // 清理空的 children 字段（如果需要）
  if (cleanEmptyChildren) {
    function clean(node: any): void {
      if (node.children && node.children.length === 0) {
        delete node.children
      } else if (node.children) {
        node.children.forEach(clean)
      }
    }

    result.forEach(clean)
  }

  return result
}
export function convertToMenuComponentData(routes: MenuItem[]): MenuOption[] {
  return buildTree(routes, (item) => ({
    label: item.i18n_key,
    key: item.path,
    iconStr: item.icon,
    children: undefined, // 初始化为空，由 buildTree 处理
  }))
}
export function convertToRoutes(routes: MenuItem[]): RouteRecordRaw[] {
  return buildTree(routes, (item) => ({
    id: item.id,
    path: item.path ?? '',
    name: item.name,
    component: modules[`../views/${item.comp_url}.vue`], // 确保路径正确
    meta: {
      title: item.name,
      i18nKey: item.i18n_key,
      icon: item.icon,
      id: item.id,
      status: item.status,
      parentId: item.parent_id,
    },
    children: undefined, // 初始化为空，由 buildTree 处理
  }))
}
export function convertToMenusPage(routes: MenuItem[]): any[] {
  return buildTree(routes, (item) => ({
    ...item,
    children: undefined, // 初始化为空，由 buildTree 处理
  }))
}
/**
 * 深拷贝函数，用于创建对象的深拷贝。
 *
 * @param obj 要进行深拷贝的对象。
 * @returns 深拷贝后的对象。
 * @template T 要拷贝对象的类型。
 */
export function deepClone<T>(obj: T | T[]): T | T[] {
  if (obj === null || typeof obj !== 'object') {
    return obj
  }

  if (Array.isArray(obj)) {
    // 当 obj 是数组时，递归克隆每个元素并返回数组
    return (obj as T[]).map((item) => deepClone(item)) as T[]
  } else {
    // 当 obj 是对象时，递归克隆每个属性并返回新对象
    const result: Partial<T> = {} as Partial<T>
    for (const key in obj) {
      if (Object.prototype.hasOwnProperty.call(obj, key)) {
        result[key] = deepClone((obj as any)[key])
      }
    }
    return result as T
  }
}
